/**
 * 
 */
package ru.sis.shop.model.image;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.commons.lang3.RandomStringUtils;

/**
 * @author sis
 * 
 */
public class ImageStorageService {
	private static final int FILE_NAME_LENGTH = 16;
	private static final String THUMBNAILS_DIRECTORY = "thumbnails";
	private final String basePath;

	public ImageStorageService(String basePath) throws IOException {
		super();
		this.basePath = basePath;

		Path path = Paths.get(basePath);
		if (!Files.exists(path)) {
			Files.createDirectories(path);
		}

		Path thumnailsPath = Paths.get(basePath, THUMBNAILS_DIRECTORY);
		if (!Files.exists(thumnailsPath)) {
			Files.createDirectory(thumnailsPath);
		}
	}

	/**
	 * Сохранить полученное изображение.
	 * 
	 * @param is
	 *            входной поток изображения
	 * @return возвращает ключ
	 * @throws IOException
	 */
	public synchronized String store(InputStream is) throws IOException {
		String src = getNextSrc();
		Files.copy(is, Paths.get(basePath, src));
		return src;
	}

	/**
	 * Удалить изображение с ключем {@code src}.
	 * 
	 * @param src
	 */
	public void remove(String src) {
		try {
			Files.deleteIfExists(Paths.get(basePath, src));
		} catch (IOException e) {
			// TODO trace to log
			e.printStackTrace();
		}

		String glob = src.concat("*.jpeg");
		Path thumbnailsPath = Paths.get(basePath, THUMBNAILS_DIRECTORY);

		try (DirectoryStream<Path> ds = Files.newDirectoryStream(thumbnailsPath, glob)) {
			for (Path p : ds) {
				System.out.println(p.getFileName());
			}
		} catch (IOException e) {
			// TODO trace to log
			e.printStackTrace();
		}
	}

	public void prepare(Key key) {
//		Path path = key.isThumbnails() ? Paths.get(basePath, THUMBNAILS_DIRECTORY, key.toString())
//				: Paths.get(basePath, THUMBNAILS_DIRECTORY, key.toString());
//		
//		if (!Files.exists(path)) {
//			Builder<File> builder = Thumbnails.of(path.toFile());
//			if (key.) {
//				
//			}
//		}
	}

	/**
	 * Ключ к изображению. Через него можно получить доступ к уменьшенным
	 * изображениям, или изображениям с нанесенными водяными знаками.
	 * 
	 * @author sis
	 * 
	 */
	public class Key {
		private final String src;
		private Integer width;
		private Boolean hasWatermark;

		public Key(String src) {
			super();
			this.src = src;
		}

		public Key width(int width) {
			this.width = width;
			return this;
		}

		public Key watermark() {
			this.hasWatermark = true;
			return this;
		}

		public boolean isThumbnails() {
			return width != null || hasWatermark != null;
		}

		@Override
		public String toString() {
			StringBuilder builder = new StringBuilder(src);
			if (width != null) {
				builder.append("_").append(width).append("px");
			}

			if (hasWatermark) {
				builder.append("_watermark");
			}

			builder.append(".jpeg");
			return builder.toString();
		}
	}

	private String getNextSrc() {
		while (true) {
			String src = RandomStringUtils.randomAlphanumeric(FILE_NAME_LENGTH);
			Path path = Paths.get(basePath, src);
			if (!Files.exists(path)) {
				return src;
			}
		}
	}
}
